"""
deque（双端队列）是一个非常有用的数据结构。deque 是 "double-ended queue" 的缩写，它支持从两端高效地添加和删除元素。
与列表相比，deque 在两端进行插入和删除操作时性能更好，特别是在处理大量数据时。

主要特点
1. 高效的操作：
- 从两端添加和删除元素的时间复杂度为 O(1)。
- 随机访问元素的时间复杂度为 O(n)。
2. 线程安全：
- deque 是线程安全的，可以在多线程环境中使用。
3.最大长度：
- 可以设置最大长度，当超过最大长度时，会自动从另一端弹出元素

使用场景
1. 队列和栈：
- deque 可以用来实现队列（FIFO）和栈（LIFO）。对于队列，可以使用 append 和 popleft；对于栈，可以使用 append 和 pop。
2. 滑动窗口：
- 在处理流数据或需要维护固定大小窗口的应用中，deque 非常有用。你可以设置最大长度，当新的元素加入时，旧的元素会自动被移除。
3. 多线程环境：
- 由于 deque 是线程安全的，它可以用于多线程编程中的任务队列或消息传递。
4. 缓存：
- deque 可以用来实现简单的缓存机制，例如最近最少使用（LRU）缓存。
5. 日志记录：
- 在日志记录系统中，deque 可以用来存储最近的日志条目，当达到最大长度时自动丢弃最早的条目。


任务
- 如何创建
- 如何添加元素
- 如何设置最大元素数
"""
from collections import deque

# 1. case1
# 创建一个空的 deque
d = deque()
# 从可迭代对象创建 deque
d = deque([1, 2, 3, 4])
# 设置最大长度
d = deque(maxlen=15)

d.extend([5, 6])  # [1, 2, 3, 4, 5, 6]
d.extendleft([0, -1])  # [-1, 0, 1, 2, 3, 4, 5, 6]
d.rotate(2)  # [5, 6, -1, 0, 1, 2, 3, 4]
d.rotate(-2)  # [-1, 0, 1, 2, 3, 4, 5, 6]
print(d)

# 2. case2

# 队列 (FIFO)
queue = deque()
queue.append(1)
queue.append(2)
queue.append(3)
print(queue.popleft())  # 输出: 1
print(queue)  # 输出: deque([2, 3])

# 栈 (LIFO)
stack = deque()
stack.append(1)
stack.append(2)
stack.append(3)
print(stack.pop())  # 输出: 3
print(stack)  # 输出: deque([1, 2])

# 3. case3

queue = deque()
queue.append(1)
queue.append(2)

print(queue)

queue.popleft()
print(queue)

queue.appendleft(1)
print(queue)
queue.pop()
print(queue)
